package p24_ControllerAdvice之InitBinder;

import org.springframework.context.annotation.Configuration;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.WebDataBinder;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.InitBinder;

/**
 * Advice，通知的意思，引申的含义是功能增强
 * @ControllerAdvice，表示对@Controller控制器提供功能增强，哪能提供哪些增强功能?
 *    1.@ExceptionHandler：加在方法上，对控制器抛出的异常进行处理
 *    2.@ModelAttribute：加在方法上，方法的返回值会作为模型数据补充到控制器执行过程中
 *    3.@InitBinder：补充自定义类型转换器
 * @ControllerAdvice对控制器提供的功能增强，是全局的；控制器自己也可以给自己提供功能增强，只不过这种增强不是全局的，而是单独属于控制器自己
 * @ControllerAdvice里三个注解，同样定义在@Controller控制器里面
 * 注：advice和前面的advisor(低级切面)没有半毛钱关系
 */
@Configuration
public class WebConfig {
    /**
     * ControllerAdvice就是给Controller控制器做增强(全局的)
     */
    @ControllerAdvice
    static class MyControllerAdvice {
        //对所有控制器都生效的类型转换器
        @InitBinder
        public void binder1(WebDataBinder dataBinder) {
            dataBinder.addCustomFormatter(null);
        }
    }

    /**
     * 控制器类自己也有增强，只不过仅使用当前控制器
     */
    @Controller
    static class Controller1 {
        public void foo() {}

        //对当前控制器生效
        @InitBinder
        public void binder2(WebDataBinder dataBinder) {
            dataBinder.addCustomFormatter(null);
        }
    }
    @Controller
    static class Controller2 {
        public void foo() {}

        @InitBinder
        public void binder3(WebDataBinder dataBinder) {
            dataBinder.addCustomFormatter(null);
        }
    }
}
